//让对象去借用一个原本不属于它的方法
var obj1={
    name:"二狗子",
}
var obj2={
    getName:function(){
        return this.name;
    }
}
console.log(obj2.getName.call(obj1));

/*让类数组对象去借用Array.prototype 的方法，这是call 和apply 最常见的应用场景之一：*/
(function(){
    Array.prototype.push.call(arguments,43);// arguments 借用Array.prototype.push 方法
    console.log(arguments)
})(1,2,3,)

/*把泛化this 的过程提取出来*/
Function.prototype.uncurrying=function(){
    var self=this;
    return function(){
        var obj=Array.prototype.shift.call(arguments);
        return self.apply(obj,arguments);
    }
}
/*Function.prototype.uncurrying = function(){
var self = this;
return function(){
return Function.prototype.call.apply( self, arguments );
}
};
*/
/*作用：在类数组对象arguments 借用Array.prototype 的方法之前，先把Array.prototype.push.call这句代码转换为一个通用的push 函数：*/
var push = Array.prototype.push.uncurrying();
(function(){
    push( arguments, 4 );
    console.log( arguments ); // 输出：[1, 2, 3, 4]
})( 1, 2, 3 );

/*可以一次性地把Array.prototype 上的方法“复制”到array 对象上，同样这些方法可操作的对象也不仅仅只是array 对象：*/
for ( var i = 0, fn, ary = [ 'push', 'shift', 'forEach' ]; fn = ary[ i++ ]; ){
    Array[ fn ] = Array.prototype[ fn ].uncurrying();
};
var obj = {
    "length": 3,
    "0": 1,
    "1": 2,
    "2": 3
};
Array.push( obj, 4 ); // 向对象中添加一个元素
console.log( obj.length ); // 输出：4
var first = Array.shift( obj ); // 截取第一个元素
console.log( first ); // 输出：1
console.log( obj ); // 输出：{0: 2, 1: 3, 2: 4, length: 3}
Array.forEach( obj, function( i, n ){
    console.log( n ); // 分别输出：0, 1, 2
});
